/*
 * @Description: 
 * @Author: Sun
 * @Date: 2024-08-03 09:52:12
 * @LastEditors: Sun
 * @LastEditTime: 2024-08-03 10:33:21
 */
let a: string;
let b1: 10;
// 联合类型
let b2: "xiao" | "news";
b2 = "xiao"
b2 = "news"

// 联合类型 任意类型
let d: any;
d = 10;
d = "xoap";
d = true;

//unknown 表示未知类型 俺漏
// 4  any和unknown有何区别？
// 1 类型安全性：any类型：它表示任何类型，允许你对变量执行任何操作而不需要进行类型检查。这可能会导致潜在的错误，
// 因为编译器不会为你进行任何类型相关的检查。
//                 unknown类型：它也表示任何类型，但它是类型安全的。在对unknown类型的值进行任何操作之前，
// 你必须进行某种形式的类型检查或断言，以确保变量的确切类型。这有助于提高代码的安全性。
// 2 赋值和类型兼容性 any类型：可以接受任何类型的赋值，并且可以赋值给任何类型的变量。
// 这意味着你可以将any类型的变量赋值给任何类型的变量，而不会引发编译错误。
//                    unknown类型：虽然可以接受任何类型的赋值，但只能赋值给unknown或any类型的变量。
// 如果你尝试将unknown类型的变量赋值给其他类型的变量，将会引发编译错误。
// 3属性和方法访问：any类型：你可以直接访问any类型变量的属性和方法，而不需要进行类型检查。
// 这可能导致在运行时出现属性或方法不存在的错误。
//                  unknown类型：你不能直接访问unknown类型变量的属性和方法， 除非你首先通过类型断言或
// 类型守卫来确保变量的确切类型。这有助于避免在运行时出现错误。
// 4使用场景：any类型：通常用于当你需要绕过类型检查时。例如，当你从用户输入或外部数据源获取数据时，
// 你可能不确定数据的类型，这时可以使用any类型来避免类型检查。但是，
// 使用any类型需要小心，因为它可能会导致运行时错误
//             unknown类型：用于当你需要确保类型安全时。例如，当你从不可信的源头获取数据时，使用unknown类型
// 可以强制你在使用数据之前进行类型检查。这有助于减少潜在的类型错误和运行时错误。
// 5性能：由于any类型关闭了类型检查，因此在某些情况下可能会提高编译速度。但是，这可能会导致运行时错误和调试困难。
//          unknown类型虽然在进行类型检查时会稍微降低编译速度，但它有助于提高代码的安全性和可维护性。
let b3: unknown;
b3 = "asda"
b3 = true

//如何把unknown俺漏 赋值给其他对象？
//1 typeof  判断
// if(typeof b3==="string"){ a = b3 }
//2 断言
// 变量 as 类型
// <类型> 变量
a = b3 as string;

a = <string>b3;

function an():string|number{
  return "333"
  
}

//void 没有返回值 空 我的
function an1(): void {
console.log("sdfdsf")
}


//never 空值 永远不会返回接口  来问
function an2(): never {
  throw new Error("报错了")
}